# 阿里云云市场爬虫

from ._base import *


class SpiderAliyun(SpiderBase):
    def __init__(self):
        super().__init__()
        self.source_url = 'https://market.aliyun.com'

    def get_app_list(self, url=None, page=1):
        # 阿里云使用了AJAX技术进行前后端分离，故可以直接请求获取json，经测试得到pageSize最大只能为100，更大的pageSize是无效的
        # 阿里云的queryProducts.json中就已经包含了基本上所有我们需要的信息，除了没有评论数量，并且价格信息部分有缺失
        # 此函数的返回并不像京东万象爬虫的对应函数一样只是一个URL的列表，而是返回了基本上完整的原始请求返回信息
        if url is None:
            url = self.source_url + '/api/ajax/product/queryProducts.json?pageSize=100&pageIndex=' + str(page)
        else:
            url = self.source_url + '/api/ajax/product/queryProducts.json?pageSize=100&pageIndex=' + str(page) + \
                  '&categoryId=' + url
        r = requests.get(url, headers={'referer': 'https://market.aliyun.com/products?'})
        r_json = r.json()
        return r_json['result']['products'], int(r_json['result']['totalPage'])

    def get_app_info(self, item):
        # 此函数接受self.get_app_list()返回的list的一项，而非url，返回值与京东万象有如下区别：
        # label、view、favorite均为None
        # label_url类型不同，jdwx为str，aliyun为list，且并非完整url，而是categoryId，完整url格式为/products/{categoryId}
        # price格式不同
        info_dict = {
            'url': item['url'].split('?')[0],
            'title': item['name'],
            'tags': item['tagList'],
            'intro': item['short_description'],
            'price': [],
            'rating': float(item['score']),
            'label': None,
            'label_url': item['categoryIds'],
            'shop': item['shop_name'],
            'shop_url': item['shop_url'],
            'view': None,
            'buy': item['user_count'],
            'favorite': None,
            'comment': 0
        }
        r = requests.get(self.source_url + '/api/ajax/product/queryRates.json?curPage=1&pageIndex=1&productCode=' +
                         item['productcode'], headers={'referer': self.source_url + info_dict['url']})
        info_dict['comment'] = int(r.json()['result']['totalRecords'])

        r = requests.get(self.source_url + '/api/ajax/product/queryProductPricingPlan.json?productCode=' +
                         item['productcode'] + '&skuCode=' + item['productcode'] + '-prepay',
                         headers={'referer': self.source_url + info_dict['url']})
        # info_dict['price'] = [[price['version'], price['modules'][0]['tradePrice']['newOrder'][0]['value']]
        #                       for price in r.json()['result']]
        info_dict['price'] = r.json()['result']

        return info_dict
